#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.h"


void InitStack(ST* ps)
{
    assert(ps);
    STDataType* a= (STDataType*)malloc(sizeof(STDataType)*4);
    if (a == NULL)
    {
        perror("malloc");
        return;
    }
    ps->a = a;
    ps->top = 0;
    ps->capacity = 4;
}

void STPush(ST* ps, STDataType x)
{
    assert(ps);
    if (ps->top == ps->capacity)
    {
        STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType)*ps->capacity* 2);
        if (tmp == NULL)
        {
            perror("realloc");
            return;
        }
        ps->a = tmp;
        ps->capacity *= 2;
    }
    ps->a[ps->top] = x;
    ps->top++;
}

void STPop(ST* ps)
{
    assert(ps);
    assert(!STEmpty(ps));
    ps->top--;
}
int STsize(ST* ps)
{
    assert(ps);
    return ps->top;
}
bool STEmpty(ST* ps)
{
    assert(ps);
    return ps->top == 0;
}
void STDestroy(ST* ps)
{
    assert(ps);
    free(ps->a);
    ps->capacity = 0;
    ps->top = 0;
}
STDataType STtop(ST* ps)
{
    assert(ps);
    assert(!STEmpty(ps));
    return ps->a[ps->top - 1];
}
